// Package sales
// @Title sales[简述该包的主要作用]
// @Description
// @Author  cnHuaShao
// @since v0.0.1
// @Version v1.0.0
// @Date 2024/6/6 17:22
// @Update 2024/6/6 17:22
package sales

import (
	"FinancialManagement/src/base/baselog"
	"FinancialManagement/src/business/purchase"
	"github.com/shopspring/decimal"
	"go.uber.org/zap"
)

// DeleteSalesDetail
// @Description: 删除指定销售单
// @param id
// @return error
func DeleteSalesDetail(id int) error {
	sd := SalesDetail{SalesID: id}
	err := sd.deleteSalesDetail()
	return err
}

// DeleteSalesDetailItem
// @Description:  删除指定销售明细
// @param salesId
func DeleteSalesDetailItem(sdiId, salesId int) error {
	sdi := SalesDetailItem{SdiID: sdiId, SalesID: salesId}
	// 最终进行删除销售明细
	err := sdi.DeleteSalesDetailItem()
	if err != nil {
		baselog.Logger.Error("删除销售明细时失败", zap.Error(err))
		return err
	}
	// 更新销售单信息
	err = updateSalesDetailPrice(salesId)
	return err
}

// CreateSalesDetailItem
// @Description: 添加销售明细并更新销售单信息
// @receiver salesDetailItem
// @return error
func (salesDetailItem *SalesDetailItem) CreateSalesDetailItem() error {
	// 计算销售明细成本价格，这个计算时是在前端进行计算
	/*err := salesDetailItem.updateSalesDetailItemPrice()
	if err != nil {
		baselog.Logger.Error("计算销售明细成本价格失败", zap.Error(err))
		return err
	}*/
	err := salesDetailItem.createSalesDetailItem()
	if err != nil {
		baselog.Logger.Error("添加销售明细失败", zap.Error(err))
		return err
	}
	// 依据销售单ID进行计算该销售单中计算项并更新
	return updateSalesDetailPrice(salesDetailItem.SalesID)
}

// UpdateSalesDetailItem
// @Description: 修改指定销售明细并更新销售单信息
// @receiver salesDetailItem
// @return error
func (salesDetailItem *SalesDetailItem) UpdateSalesDetailItem() error {
	// 更新销售明细
	err := salesDetailItem.updateSalesDetailItem()
	if err != nil {
		baselog.Logger.Error("更新销售明细失败", zap.Error(err))
		return err
	}
	// 更新销售单信息
	return updateSalesDetailPrice(salesDetailItem.SalesID)
}

// CreateSalesDetail
// @Description: 添加销售订单
// @receiver salesDetail
// @return error
func (salesDetail *SalesDetail) CreateSalesDetail() error {
	err := salesDetail.createSalesDetail()
	if err != nil {
		baselog.Logger.Error("添加销售订单失败", zap.Error(err))
		return err
	}
	return nil
}

// UpdateSalesInfoOnPurchase
// @Description:  依据采购单信息进行更新销售单中的各项内容
// @param salesId 销售订单编号
// @return error
func UpdateSalesInfoOnPurchase(salesId int) error {
	// 获取销售单
	salesDetail, err := GetSalesDetailInfoAndItems(salesId)
	if err != nil {
		return err
	}
	// 获取对应的采购单
	purchaseInfo, err := purchase.GetPurchaseInfo(salesDetail.PurchaseId)
	if err != nil {
		return err
	}
	salesDetail.SalesPureProfit = decimal.NewFromInt32(0)
	baselog.Logger.Debug("进入计算采购单信息")
	for _, salesDetailItem := range salesDetail.Items {
		// 计算销售明细各项成本和利润价格
		err = salesDetailItem.updateSalesDetailItemPrice(purchaseInfo.PurchaseUnitCost)
		if err != nil {
			baselog.Logger.Error("计算销售明细各项成本和利润价格时出现错误", zap.Error(err))
		}
		err = salesDetailItem.updateSalesDetailItem()
		if err != nil {
			baselog.Logger.Error("更新销售明细时出现错误", zap.Error(err))
		}

	}
	// 计算销售纯利润 = 销售总价格 - 采购总价格 - 采购运费
	salesDetail.SalesPureProfit = salesDetail.SalesActualTotalPrice.Sub(purchaseInfo.PurchaseActualAmount).Sub(decimal.NewFromInt32(int32(purchaseInfo.PurchaseFreight)))
	// 修改指定销售单信息
	return salesDetail.UpdateSalesDetail()
}
